Skip to content
本页目录

选择排序

规则:

  • 升序:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位
  • 降序:双重循环遍历数组,每经过一轮比较,找到最大元素的下标,将其交换至首位

一元选择

JavaScript
const selectionSort = A => {
  const len = A.length

  for (let i = 0; i < len - 1; i++) {
    let minIdx = i
    for (let j = i + 1; j < len; j++) { // 前 i+1 个数已排序
      if (A[minIdx] > A[j]) minIdx = j // 找出未排序数中最小值的下标
    }
    if (minIdx !== i) { // 相等时不交换
      [A[minIdx], A[i]] = [A[i], A[minIdx]]
    }
  }
}

二元选择

JavaScript
const selectionSort = A => {
  const len = A.length
  
  // 由于每趟排序必有两个元素(最小值、最大值)被排序,故只需遍历原数据的一半
  for (let i = 0; i < len >> 1; i++) {
    let minIdx = maxIdx = i
    for (let j = i + 1; j < len - i; j++) {
      if (A[minIdx] > A[j]) minIdx = j
      if (A[maxIdx] < A[j]) maxIdx = j
    }
    if (minIdx === maxIdx) break // 说明排序已完成
    if (minIdx !== i) {
      // 将最小元素置于最前
      [A[minIdx], A[i]] = [A[i], A[minIdx]]
    }
    // 最大值的下标刚好是 i 时,由于 A[i] 与 A[minIdx] 交换时将最大值换到了 minIdx 处
    if (maxIdx === i) maxIdx = minIdx
    const lastIdx = len - 1 - i
    if (maxIdx !== lastIdx) {
      // 将最大元素置于最后
      [A[maxIdx], A[lastIdx]] = [A[lastIdx], A[maxIdx]]
    }
  }
}